home *** CD-ROM | disk | FTP | other *** search
- A REPORT ON THE INTERNET WORM
- Bob Page
- University of Lowell
- Computer Science Department
- November 7, 1988
-
-
- [Because of the many misquotes the media have been
- giving, this report is Copyright (c) Bob Page, all
- rights reserved. Permission is granted to republish
- this ONLY if you republish it in its entirety.]
-
- Here's the scoop on the "Internet Worm". Actually it's
- not a virus - a virus is a piece of code that adds
- itself to other programs, including operating systems.
- It cannot run independently, but rather requires that
- its "host" program be run to activate it. As such, it
- has a clear analog to biologic viruses -- those viruses
- are not considered live, but they invade host cells and
- take them over, making them produce new viruses.
-
- A worm is a program that can run by itself and can
- propagate a fully working version of itself to other
- machines. As such, what was loosed on the Internet was
- clearly a worm.
-
- This data was collected through an emergency mailing
- list set up by Gene Spafford at Purdue University, for
- administrators of major Internet sites - some of the
- text is included verbatim from that list. Mail was
- heavy since the formation of the list; it continues to
- be on Monday afternoon - I get at least 2-3 messages
- every hour. It's possible that some of this information
- is incomplete, but I thought you'd like to know what I
- know so far.
-
- The basic object of the worm is to get a shell on
- another machine so it can reproduce further. There are
- three ways it attacks: sendmail, fingerd, and
- rsh/rexec.
-
- THE SENDMAIL ATTACK:
-
- In the sendmail attack, the worm opens a TCP connection
- to another machine's sendmail (the SMTP port), invokes
- debug mode, and sends a RCPT TO that requests its data
- be piped through a shell. That data, a shell script
- (first-stage bootstrap) creates a temporary
- second-stage bootstrap file called x$$,l1.c (where '$$'
- is the current process ID). This is a small (40-line) C
- program.
-
- The first-stage bootstrap compiles this program with
- the local cc and executes it with arguments giving the
- Internet hostid/socket/password of where it just came
- from. The second-stage bootstrap (the compiled C
- program) sucks over two object files, x$$,vax.o and
- x$$,sun3.o from the attacking host. It has an array for
- 20 file names (presumably for 20 different machines),
- but only two (vax and sun) were compiled in to this
- code. It then figures out whether it's running under
- BSD or SunOS and links the appropriate file against the
- C library to produce an executable program called
- /usr/tmp/sh - so it looks like the Bourne shell to
- anyone who looked there.
-
- THE FINGERD ATTACK:
-
- In the fingerd attack, it tries to infiltrate systems
- via a bug in fingerd, the finger daemon. Apparently
- this is where most of its success was (not in sendmail,
- as was originally reported). When fingerd is connected
- to, it reads its arguments from a pipe, but doesn't
- limit how much it reads. If it reads more than the
- internal 512-byte buffer allowed, it writes past the
- end of its stack. After the stack is a command to be
- executed ("/usr/ucb/finger") that actually does the
- work. On a VAX, the worm knew how much further from the
- stack it had to clobber to get to this command, which
- it replaced with the command "/bin/sh" (the bourne
- shell). So instead of the finger command being
- executed, a shell was started with no arguments. Since
- this is run in the context of the finger daemon, stdin
- and stdout are connected to the network socket, and all
- the files were sucked over just like the shell that
- sendmail provided.
-
- THE RSH/REXEC ATTACK:
-
- The third way it tried to get into systems was via the
- .rhosts and /etc/hosts.equiv files to determine
- 'trusted' hosts where it might be able to migrate to.
- To use the .rhosts feature, it needed to actually get
- into people's accounts - since the worm was not running
- as root (it was running as daemon) it had to figure out
- people's passwords. To do this, it went through the
- /etc/passwd file, trying to guess passwords. It tried
- combinations of: the username, the last, first,
- last+first, nick names (from the GECOS field), and a
- list of special "popular" passwords:
-
-
-
- aaa cornelius guntis noxious simon
- academia couscous hacker nutrition simple
- aerobics creation hamlet nyquist singer
- airplane creosote handily oceanography single
- albany cretin happening ocelot smile
- albatross daemon harmony olivetti smiles
- albert dancer harold olivia smooch alex
- daniel harvey oracle smother alexander
- danny hebrides orca snatch algebra dave
- heinlein orwell snoopy aliases december
- hello osiris soap alphabet defoe help
- outlaw socrates ama deluge herbert oxford
- sossina amorphous desperate hiawatha pacific
- sparrows analog develop hibernia painless spit
- anchor dieter honey pakistan spring
- andromache digital horse pam springer
- animals discovery horus papers squires
- answer disney hutchins password strangle
- anthropogenic dog imbroglio patricia stratford
- anvils drought imperial penguin stuttgart
- anything duncan include peoria subway aria
- eager ingres percolate success ariadne
- easier inna persimmon summer arrow edges
- innocuous persona super arthur edinburgh
- irishman pete superstage athena edwin isis
- peter support atmosphere edwina japan
- philip supported aztecs egghead jessica
- phoenix surfer azure eiderdown jester
- pierre suzanne bacchus eileen jixian
- pizza swearer bailey einstein johnny
- plover symmetry banana elephant joseph
- plymouth tangerine bananas elizabeth joshua
- polynomial tape bandit ellen judith
- pondering target banks emerald juggle pork
- tarragon barber engine julia poster
- taylor baritone engineer kathleen praise
- telephone bass enterprise kermit precious
- temptation bassoon enzyme kernel prelude
- thailand batman ersatz kirkland prince
- tiger beater establish knight princeton
- toggle beauty estate ladle protect
- tomato beethoven euclid lambda protozoa
- topography beloved evelyn lamination
- pumpkin tortoise benz extension larkin puneet
- toyota beowulf fairway larry puppet
- trails berkeley felicia lazarus rabbit
- trivial berliner fender lebesgue rachmaninoff
- trombone beryl fermat lee rainbow tubas
- beverly fidelity leland raindrop tuttle
- bicameral finite leroy raleigh umesh bob
- fishers lewis random unhappy brenda
- flakes light rascal unicorn brian
- float lisa really unknown bridget flower
- louis rebecca urchin broadway flowers
- lynne remote utility bumbling foolproof
- macintosh rick vasant burgess football mack
- ripple vertigo campanile foresight maggot
- robotics vicky cantor format magic
- rochester village cardinal forsythe malcolm
- rolex virginia carmen fourier mark romano
- warren carolina fred markus ronald water
- caroline friend marty rosebud weenie
- cascades frighten marvin rosemary whatnot
- castle fun master roses whiting cat
- fungible maurice ruben whitney cayuga
- gabriel mellon rules will celtics gardner
- merlin ruth william cerulean garfield mets sal
- williamsburg change gauss michael saxon
- willie charles george michelle scamper
- winston charming gertrude mike scheme wisconsin
- charon ginger minimum scott wizard
- chester glacier minsky scotty wombat
- cigar gnu moguls secret
-
- woodwind classic golfer moose sensor
- wormwood clusters gorgeous morley serenity yaco
- coffee gorges mozart sharks yang coke
- gosling nancy sharon yellowstone collins
- gouge napoleon sheffield yosemite commrades
- graham nepenthe sheldon zap computer gryphon
- ness shiva zimmerman condo guest network
- shivers cookie guitar newton shuttle
- cooper gumption next signature
-
-
-
- [I wouldn't have picked some of these as "popular"
- passwords, but then again, I'm not a worm writer. What
- do I know?]
-
- When everything else fails, it opens /usr/dict/words
- and tries every word in the dictionary. It is pretty
- successful in finding passwords, as most people don't
- choose them very well. Once it gets into someone's
- account, it looks for a .rhosts file and does an 'rsh'
- and/or 'rexec' to another host, it sucks over the
- necessary files into /usr/tmp and runs /usr/tmp/sh to
- start all over again.
-
- Between these three methods of attack (sendmail,
- fingerd, .rhosts) it was able to spread very quickly.
-
- THE WORM ITSELF:
-
- The 'sh' program is the actual worm. When it starts up
- it clobbers its argv array so a 'ps' will not show its
- name. It opens all its necessary files, then unlinks
- (deletes) them so they can't be found (since it has
- them open, however, it can still access the contents).
- It then tries to infect as many other hosts as possible
- - when it sucessfully connects to one host, it forks a
- child to continue the infection while the parent keeps
- on trying new hosts.
-
- One of the things it does before it attacks a host is
- connect to the telnet port and immediately close it.
- Thus, "telnetd: ttloop: peer died" in /usr/adm/messages
- means the worm attempted an attack.
-
- The worm's role in life is to reproduce - nothing more.
- To do that it needs to find other hosts. It does a
- 'netstat -r -n' to find local routes to other hosts &
- networks, looks in /etc/hosts, and uses the yellow
- pages distributed hosts file if it's available. Any
- time it finds a host, it tries to infect it through one
- of the three methods, see above. Once it finds a local
- network (like 129.63.nn.nn for ulowell) it sequentially
- tries every address in that range.
-
- If the system crashes or is rebooted, most system boot
- procedures clear /tmp and /usr/tmp as a matter of
- course, erasing any evidence. However, sendmail log
- files show mail coming in from user /dev/null for user
- /bin/sed, which is a tipoff that the worm entered.
-
- Each time the worm is started, there is a 1/15 chance
- (it calls random()) that it sends a single byte to
- ernie.berkeley.edu on some magic port, apparently to
- act as some kind of monitoring mechanism.
-
- THE CRACKDOWN:
-
- Three main 'swat' teams from Berkeley, MIT and Purdue
- found copies of the VAX code (the .o files had all the
- symbols intact with somewhat meaningful names) and
- disassembled it into about 3000 lines of C. The BSD
- development team poked fun at the code, even going so
- far to point out bugs in the code and supplying source
- patches for it! They have not released the actual
- source code, however, and refuse to do so. That could
- change - there are a number of people who want to see
- the code.
-
- Portions of the code appear incomplete, as if the
- program development was not yet finished. For example,
- it knows the offset needed to break the BSD fingerd,
- but doesn't know the correct offset for Sun's fingerd
- (which causes it to dump core); it also doesn't erase
- its tracks as cleverly as it might; and so on.
-
- The worm uses a variable called 'pleasequit' but
- doesn't correctly initialize it, so some folks added a
- module called _worm.o to the C library, which is
- produced from: int pleasequit = -1; the fact that this
- value is set to -1 will cause it to exit after one
- iteration.
-
- The close scrutiny of the code also turned up comments
- on the programmer's style. Verbatim from someone at
- MIT: From disassembling the code, it looks like the
- programmer is really anally retentive about checking
- return codes, and, in addition, prefers to use array
- indexing instead of pointers to walk through arrays.
-
- Anyone who looks at the binary will not see any
- embedded strings - they are XOR'ed with 81 (hex).
- That's how the shell commands are imbedded. The
- "obvious" passwords are stored with their high bit set.
-
-
- Although it spreads very fast, it is somewhat slowed
- down by the fact that it drives the load average up on
- the machine - this is due to all the encryptions going
- on, and the large number of incoming worms from other
- machines.
-
- [Initially, the fastest defense against the worm is is
- to create a directory called /usr/tmp/sh. The script
- that creates /usr/tmp/sh from one of the .o files
- checks to see if /usr/tmp/sh exists, but not to see if
- it's a directory. This fix is known as 'the condom'.]
-
- NOW WHAT?
-
- None of the ULowell machines were hit by the worm. When
- BBN staffers found their systems infected, they cut
- themselves off from all other hosts. Since our
- connection to the Internet is through BBN, we were cut
- off as well. Before we were cut off, I received mail
- about the sendmail problem and installed a patch to
- disable the feature the worm uses to get in through
- sendmail. I had made local modifications to fingerd
- which changed the offsets, so any attempt to scribble
- over the stack would probably have ended up in a core
- dump.
-
- Most Internet systems running 4.3BSD or SunOS have
- installed the necessary patches to close the holes and
- have rejoined the Internet. As you would expect, there
- is a renewed interest in system/network security,
- finding and plugging holes, and speculation over what
- will happen to the worm's creator.
-
- If you haven't read or watched the news, various log
- files have named the responsible person as Robert
- Morris Jr., a 23-year old doctoral student at Cornell.
- His father is head of the National Computer Security
- Center, the NSA's public effort in computer security,
- and has lectured widely on security aspects of UNIX.
-
- Associates of the student claim the worm was a
- 'mistake' - that he intended to unleash it but it was
- not supposed to move so quickly or spread so much. His
- goal (from what I understand) was to have a program
- 'live' within the Internet. If the reports that he
- intended it to spread slowly are true, then it's
- possible that the bytes sent to ernie.berkeley.edu were
- intended to monitor the spread of the worm. Some news
- reports mentioned that he panicked when, via some
- "monitoring mechanism" he saw how fast it had
- propagated.
-
- A source inside DEC reports that although the worm
- didn't make much progress there, it was sighted on
- several machines that wouldn't be on its normal
- propagation path, i.e. not gateways and not on the same
- subnet. These machines are not reachable from the
- outside. Morris was a summer intern at DEC in '87. He
- might have included names or addresses he remembered as
- targets for infesting hidden internal networks. Most of
- the DEC machines in question belong to the group he
- worked in.
-
- The final word has not been written - I don't think the
- FBI have even met with this guy yet. It will be
- interesting to see what happens.
-